package com.example.utils;

import com.example.config.JwtConfig;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;


import java.nio.charset.StandardCharsets;
import java.util.Date;

@Component
public class JwtUtil {
    @Resource
    private JwtConfig jwtConfig;

    // 创建JWT令牌
    public String createToken(Claims claims){
        // Jwts.builder()：开始构建一个新的JWT令牌。
        String token = Jwts.builder()
                // 将传入的claims设置到JWT令牌中，声明包含id
                .setClaims(claims)
                // 使用当前时间作为JWT令牌的签发时间
                .setIssuedAt(new Date())
                // 设置令牌的过期时间，当前时间戳+存活时间ttl
                .setExpiration(new Date(System.currentTimeMillis() + jwtConfig.getTtl()))
                // 使用HS256算法进行签名，使用jwtConfig中的key作为密钥
                .signWith(Keys.hmacShaKeyFor(jwtConfig.getKey().getBytes(StandardCharsets.UTF_8)))
                // 将所有信息打包成紧凑的字符串
                .compact();
        // 返回token
        return token;
    }


    // 解析JWT令牌
    public Claims parseToken(String token){
        // Jwts 是 jjwt 库中的核心类，提供了创建和解析JWT的方法。
        return Jwts.parserBuilder()
                // 设置用于签名的密钥
                .setSigningKey(Keys.hmacShaKeyFor(jwtConfig.getKey().getBytes(StandardCharsets.UTF_8)))
                // 调用build()创建JwtParser实例，JwtParser用于实际解析token
                .build()
                // 解析传入的token，并返回Jwt<Claims>对象
                .parseClaimsJws(token)
                // 提取其中claims对象
                .getBody();
    }

    // 验证token
    public boolean validateToken(String token){
         try{
             Jwts.parserBuilder()
                     .setSigningKey(Keys.hmacShaKeyFor(jwtConfig.getKey().getBytes(StandardCharsets.UTF_8)))
                     .build()
                     .parseClaimsJws(token)
                     .getBody();
         }catch (Exception e){
             return false;
         }
         return true;
    }

}
